home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / game / shoot / ADescentSrc.lha / descent / main / controls.c < prev    next >
C/C++ Source or Header  |  1998-03-03  |  9KB  |  292 lines

  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  12. */
  13. /*
  14.  * $Source: /usr/CVS/descent/main/controls.c,v $
  15.  * $Revision: 1.1.1.1 $
  16.  * $Author: nobody $
  17.  * $Date: 1998/03/03 15:12:13 $
  18.  * 
  19.  * Code for controlling player movement
  20.  * 
  21.  * $Log: controls.c,v $
  22.  * Revision 1.1.1.1  1998/03/03 15:12:13  nobody
  23.  * reimport after crash from backup
  24.  *
  25.  * Revision 1.1.1.1  1998/02/13  20:20:44  hfrieden
  26.  * Initial Import
  27.  *
  28.  * Revision 2.0  1995/02/27  11:27:11  john
  29.  * New version 2.0, which has no anonymous unions, builds with
  30.  * Watcom 10.0, and doesn't require parsing BITMAPS.TBL.
  31.  * 
  32.  * Revision 1.50  1995/02/22  14:11:19  allender
  33.  * remove anonymous unions from object structure
  34.  * 
  35.  * Revision 1.49  1994/12/15  13:04:10  mike
  36.  * Replace Players[Player_num].time_total references with GameTime.
  37.  * 
  38.  * Revision 1.48  1994/11/27  23:12:13  matt
  39.  * Made changes for new mprintf calling convention
  40.  * 
  41.  * Revision 1.47  1994/11/25  22:15:54  matt
  42.  * Added asserts to try to trap frametime < 0 bug
  43.  * 
  44.  * Revision 1.46  1994/11/16  11:25:40  matt
  45.  * Took out int3's since I determined that the errors are caused by neg frametime
  46.  * 
  47.  * Revision 1.45  1994/11/15  13:07:23  matt
  48.  * Added int3's to try to trap bug
  49.  * 
  50.  * Revision 1.44  1994/10/14  16:18:12  john
  51.  * Made Assert that the object was player just nicely exit
  52.  * the function.
  53.  * 
  54.  * Revision 1.43  1994/10/13  11:35:25  john
  55.  * Made Thrustmaster FCS Hat work.  Put a background behind the
  56.  * keyboard configure.  Took out turn_sensitivity.  Changed sound/config
  57.  * menu to new menu. Made F6 be calibrate joystick.
  58.  * 
  59.  * Revision 1.42  1994/09/29  11:22:02  mike
  60.  * Zero thrust when player dies.
  61.  * 
  62.  * Revision 1.41  1994/09/16  13:10:30  mike
  63.  * Hook in afterburner stuff.
  64.  * 
  65.  * Revision 1.40  1994/09/14  22:21:54  matt
  66.  * Avoid post-death assert
  67.  * 
  68.  * Revision 1.39  1994/09/11  20:30:27  matt
  69.  * Cleaned up thrust vars, changing a few names
  70.  * 
  71.  * Revision 1.38  1994/09/10  15:46:31  john
  72.  * First version of new keyboard configuration.
  73.  * 
  74.  * Revision 1.37  1994/09/07  15:58:12  mike
  75.  * Check for player dead in controls so you can't fire or move after dead, logical, huh?
  76.  * 
  77.  * Revision 1.36  1994/09/06  14:51:56  john
  78.  * Added sensitivity adjustment, fixed bug with joystick button not
  79.  * staying down.
  80.  * 
  81.  * Revision 1.35  1994/09/01  15:43:26  john
  82.  * Put pitch bak like it was.
  83.  * 
  84.  * Revision 1.34  1994/08/31  18:59:35  john
  85.  * Made rotthrust back like it was.
  86.  * 
  87.  * Revision 1.33  1994/08/31  18:49:17  john
  88.  * Slowed Maxrothrust a bit,
  89.  * ..
  90.  * 
  91.  * Revision 1.32  1994/08/31  18:32:05  john
  92.  * Lower max rotational thrust
  93.  * 
  94.  * Revision 1.31  1994/08/29  21:18:27  john
  95.  * First version of new keyboard/oystick remapping stuff.
  96.  * 
  97.  * Revision 1.30  1994/08/29  16:18:30  mike
  98.  * trap divide overflow.
  99.  * 
  100.  * Revision 1.29  1994/08/26  14:40:45  john
  101.  * *** empty log message ***
  102.  * 
  103.  * Revision 1.28  1994/08/26  12:23:50  john
  104.  * MAde joystick read up to 15 times per second max.
  105.  * 
  106.  * Revision 1.27  1994/08/26  10:50:59  john
  107.  * Took out Controls_always_stopped.
  108.  * 
  109.  * Revision 1.26  1994/08/26  10:47:27  john
  110.  * *** empty log message ***
  111.  * 
  112.  * Revision 1.25  1994/08/26  10:46:50  john
  113.  * New version of controls.
  114.  * 
  115.  * Revision 1.24  1994/08/25  19:41:44  john
  116.  * *** empty log message ***
  117.  * 
  118.  * Revision 1.23  1994/08/25  18:44:55  john
  119.  * *** empty log message ***
  120.  * 
  121.  * Revision 1.22  1994/08/25  18:43:46  john
  122.  * First revision of new control code.
  123.  * 
  124.  * Revision 1.21  1994/08/24  20:02:46  john
  125.  * Added cyberman support; made keys work key_down_time
  126.  * returning seconds instead of milliseconds,.
  127.  * 
  128.  * 
  129.  * Revision 1.20  1994/08/24  19:00:27  john
  130.  * Changed key_down_time to return fixed seconds instead of
  131.  * milliseconds.
  132.  * 
  133.  * Revision 1.19  1994/08/19  15:22:12  mike
  134.  * Fix divide overflow in sliding.
  135.  * 
  136.  * Revision 1.18  1994/08/19  14:42:50  john
  137.  * Added joystick sensitivity.
  138.  * 
  139.  * Revision 1.17  1994/08/17  16:50:01  john
  140.  * Added damaging fireballs, missiles.
  141.  * 
  142.  * Revision 1.16  1994/08/12  22:41:54  john
  143.  * Took away Player_stats; added Players array.
  144.  * 
  145.  * Revision 1.15  1994/08/09  16:03:56  john
  146.  * Added network players to editor.
  147.  * 
  148.  * Revision 1.14  1994/07/28  12:33:31  matt
  149.  * Made sliding use thrust, rather than changing velocity directly
  150.  * 
  151.  * Revision 1.13  1994/07/27  20:53:21  matt
  152.  * Added rotational drag & thrust, so turning now has momemtum like moving
  153.  * 
  154.  * Revision 1.12  1994/07/25  10:24:06  john
  155.  * Victor stuff.
  156.  * 
  157.  * Revision 1.11  1994/07/22  17:53:16  john
  158.  * Added better victormax support
  159.  * 
  160.  * Revision 1.10  1994/07/21  21:31:29  john
  161.  * First cheapo version of VictorMaxx tracking.
  162.  * 
  163.  * Revision 1.9  1994/07/15  15:16:18  john
  164.  * Fixed some joystick stuff.
  165.  * 
  166.  * Revision 1.8  1994/07/15  09:32:09  john
  167.  * Changes player movement.
  168.  * 
  169.  * Revision 1.7  1994/07/13  00:14:58  matt
  170.  * Moved all (or nearly all) of the values that affect player movement to 
  171.  * bitmaps.tbl
  172.  * 
  173.  * Revision 1.6  1994/07/12  12:40:14  matt
  174.  * Revamped physics system
  175.  * 
  176.  * Revision 1.5  1994/07/02  13:50:39  matt
  177.  * Cleaned up includes
  178.  * 
  179.  * Revision 1.4  1994/07/01  10:55:25  john
  180.  * Added analog joystick throttle
  181.  * 
  182.  * Revision 1.3  1994/06/30  20:04:28  john
  183.  * Added -joydef support.
  184.  * 
  185.  * Revision 1.2  1994/06/30  19:01:58  matt
  186.  * Moved flying controls code from physics.c to controls.c
  187.  * 
  188.  * Revision 1.1  1994/06/30  18:41:25  matt
  189.  * Initial revision
  190.  * 
  191.  * 
  192.  */
  193.  
  194.  
  195. #pragma off (unreferenced)
  196. static char rcsid[] = "$Id: controls.c,v 1.1.1.1 1998/03/03 15:12:13 nobody Exp $";
  197. #pragma on (unreferenced)
  198.  
  199. #include <stdlib.h>
  200.  
  201. #include "mono.h"
  202. #include "key.h"
  203. #include "joy.h"
  204. #include "timer.h"
  205. #include "error.h"
  206.  
  207. #include "inferno.h"
  208. #include "game.h"
  209. #include "object.h"
  210. #include "player.h"
  211.  
  212. #include "controls.h"
  213. #include "joydefs.h"
  214. #include "victor.h"
  215. #include "render.h"
  216. #include "args.h"
  217. #include "palette.h"
  218. #include "mouse.h"
  219. #include "kconfig.h"
  220.  
  221. //look at keyboard, mouse, joystick, CyberMan, whatever, and set 
  222. //physics vars rotvel, velocity
  223.  
  224. void read_flying_controls( object * obj )
  225. {
  226.     fix    afterburner_thrust;
  227.  
  228.     Assert(FrameTime > 0);         //Get MATT if hit this!
  229.  
  230.     if (Player_is_dead) {
  231.         vm_vec_zero(&obj->mtype.phys_info.rotthrust);
  232.         vm_vec_zero(&obj->mtype.phys_info.thrust);
  233.         return;
  234.     }
  235.  
  236.     if ((obj->type!=OBJ_PLAYER) || (obj->id!=Player_num)) return;    //references to player_ship require that this obj be the player
  237.  
  238.     //    Couldn't the "50" in the next three lines be changed to "64" with no ill effect?
  239.     obj->mtype.phys_info.rotthrust.x = Controls.pitch_time;
  240.     obj->mtype.phys_info.rotthrust.y = Controls.heading_time;
  241.     obj->mtype.phys_info.rotthrust.z = Controls.bank_time;
  242.  
  243. //    mprintf( (0, "Rot thrust = %.3f,%.3f,%.3f\n", f2fl(obj->mtype.phys_info.rotthrust.x),f2fl(obj->mtype.phys_info.rotthrust.y), f2fl(obj->mtype.phys_info.rotthrust.z) ));
  244.  
  245.     afterburner_thrust = 0;
  246.     if (Players[Player_num].flags & PLAYER_FLAGS_AFTERBURNER)
  247.         afterburner_thrust = FrameTime;
  248.  
  249.     // Set object's thrust vector for forward/backward
  250.     vm_vec_copy_scale(&obj->mtype.phys_info.thrust,&obj->orient.fvec, Controls.forward_thrust_time + afterburner_thrust );
  251.     
  252.     // slide left/right
  253.     vm_vec_scale_add2(&obj->mtype.phys_info.thrust,&obj->orient.rvec, Controls.sideways_thrust_time );
  254.  
  255.     // slide up/down
  256.     vm_vec_scale_add2(&obj->mtype.phys_info.thrust,&obj->orient.uvec, Controls.vertical_thrust_time );
  257.  
  258.     if (obj->mtype.phys_info.flags & PF_WIGGLE) {
  259.         fix swiggle;
  260.         fix_fastsincos(GameTime, &swiggle, NULL);
  261.         vm_vec_scale_add2(&obj->mtype.phys_info.velocity,&obj->orient.uvec,fixmul(swiggle,Player_ship->wiggle));
  262.     }
  263.  
  264.     // As of now, obj->mtype.phys_info.thrust & obj->mtype.phys_info.rotthrust are 
  265.     // in units of time... In other words, if thrust==FrameTime, that
  266.     // means that the user was holding down the Max_thrust key for the
  267.     // whole frame.  So we just scale them up by the max, and divide by
  268.     // FrameTime to make them independant of framerate
  269.  
  270.     //    Prevent divide overflows on high frame rates.
  271.     //    In a signed divide, you get an overflow if num >= div<<15
  272.     {
  273.         fix    ft = FrameTime;
  274.  
  275.         //    Note, you must check for ft < F1_0/2, else you can get an overflow  on the << 15.
  276.         if ((ft < F1_0/2) && (ft << 15 <= Player_ship->max_thrust)) {
  277.             mprintf((0, "Preventing divide overflow in controls.c for Max_thrust!\n"));
  278.             ft = (Player_ship->max_thrust >> 15) + 1;
  279.         }
  280.  
  281.         vm_vec_scale( &obj->mtype.phys_info.thrust, fixdiv(Player_ship->max_thrust,ft) );
  282.  
  283.         if ((ft < F1_0/2) && (ft << 15 <= Player_ship->max_rotthrust)) {
  284.             mprintf((0, "Preventing divide overflow in controls.c for max_rotthrust!\n"));
  285.             ft = (Player_ship->max_thrust >> 15) + 1;
  286.         }
  287.  
  288.         vm_vec_scale( &obj->mtype.phys_info.rotthrust, fixdiv(Player_ship->max_rotthrust,ft) );
  289.     }
  290.  
  291. }
  292.